const { RateLimiterMemory } = require('rate-limiter-flexible');

// 创建速率限制器
const rateLimiter = new RateLimiterMemory({
  points: 100, // 每个IP在时间窗口内的最大请求数
  duration: 60 // 时间窗口（秒）
});

/**
 * 请求速率限制中间件
 * @param {Object} ctx - Koa上下文
 * @param {Function} next - 下一个中间件
 */
const rateLimit = async (ctx, next) => {
  try {
    // 获取客户端IP
    const ip = ctx.ip;

    // 尝试消耗一个请求点
    await rateLimiter.consume(ip);

    // 继续处理请求
    await next();
  } catch (error) {
    if (error.name === 'RateLimiterError') {
      ctx.status = 429; // Too Many Requests
      ctx.body = {
        code: 429,
        message: '请求过于频繁，请稍后再试',
        data: {
          retryAfter: error.msBeforeNext / 1000
        }
      };
    } else {
      throw error;
    }
  }
};

module.exports = rateLimit; 